package com.cougil.uoc.seghismed.business.impl;

import java.util.Set;

import com.cougil.uoc.seghismed.business.PacientClientService;
import com.cougil.uoc.seghismed.model.Historial;
import com.cougil.uoc.seghismed.model.Pacient;
import com.cougil.uoc.seghismed.model.Usuari;
import com.cougil.uoc.seghismed.model.Visita;
import com.cougil.uoc.seghismed.model.ciphed.HistorialCiphed;
import com.cougil.uoc.seghismed.model.ciphed.PacientCiphed;
import com.cougil.uoc.seghismed.model.ciphed.VisitaCiphed;
import com.cougil.uoc.seghismed.model.comunicacions.Resposta;
import com.cougil.uoc.seghismed.model.comunicacions.enums.Resultat;
import com.cougil.uoc.seghismed.utils.SeghismedUtils;
import com.cougil.uoc.seghismed.webservice.PacientWebService;

/**
 * Classe de negoci principal de l'aplicatiu Pacient que implementa les seves principals
 * funcionalitats associades
 *
 * @author Ignacio Cougil Jares
 *
 */
public class PacientClientServiceImpl extends CoreClientServiceImpl implements
PacientClientService {

	/* (non-Javadoc)
	 * @see com.cougil.uoc.seghismed.business.PacientClientService#consultarHistorial()
	 */
	public Historial consultarHistorial() {
		CoreClientServiceImpl.logger.debug("Intentar consultar l'historial del pacient: [" + this.getUsuari()
				+ "]");
		Resposta resposta = this.autenticar();
		Historial h = null;
		if (resposta != null && Resultat.OK.equals(resposta.getResultat())) {
			Pacient emisor = (Pacient) this.getUsuari();
			Usuari destinatari = this.getGestor();
			PacientCiphed pacientCiphed = this.cipherService.xifrarPacient(emisor, emisor, destinatari);
			HistorialCiphed hCiphed = this.getWebService().consultarHistorial(pacientCiphed);
			h = this.cipherService.verificarDesxifrarHistorial(hCiphed, emisor);
		}
		CoreClientServiceImpl.logger.debug("Historial obtingut: [" + h + "]");
		return h;
	}

	/* (non-Javadoc)
	 * @see com.cougil.uoc.seghismed.business.PacientClientService#consultarPacient()
	 */
	public Pacient consultarPacient() {
		CoreClientServiceImpl.logger.debug("Intentar consultar el pacient: [" + this.getUsuari() + "]");
		Resposta resposta = this.autenticar();
		Pacient p = null;
		if (resposta != null && Resultat.OK.equals(resposta.getResultat())) {
			Pacient emisor = (Pacient) this.getUsuari();
			Usuari destinatari = this.getGestor();
			PacientCiphed pacientCiphed = this.cipherService.xifrarPacient(emisor, emisor, destinatari);
			pacientCiphed = this.getWebService().consultarPacient(pacientCiphed);
			p = this.cipherService.desxifrarPacient(pacientCiphed, emisor);
		}
		CoreClientServiceImpl.logger.debug("Pacient obtingut: [" + p + "]");
		return p;

	}

	/*
	 * (non-Javadoc)
	 *
	 * @see
	 * com.cougil.uoc.seghismed.business.PacientClientService#consultarVisita(com.cougil.uoc.seghismed
	 * .model.Visita)
	 */
	public Visita consultarVisita(Visita visita) {
		CoreClientServiceImpl.logger.debug("Intentar consultar la visita: [" + visita + "]");
		Resposta resposta = this.autenticar();
		Visita v = null;
		if (resposta != null && Resultat.OK.equals(resposta.getResultat())) {
			Pacient emisor = (Pacient) this.getUsuari();
			Usuari destinatari = this.getGestor();
			PacientCiphed pacientCiphed = this.cipherService.xifrarPacient(emisor, emisor, destinatari);
			VisitaCiphed visitaCiphed = this.cipherService.signarXifrarVisita(visita, emisor, destinatari);
			visitaCiphed = this.getWebService().consultarVisita(pacientCiphed, visitaCiphed);
			v = this.cipherService.verificarDesxifrarVisita(visitaCiphed, emisor);
		}
		CoreClientServiceImpl.logger.debug("Visita obtinguda: [" + v + "]");
		return v;
	}


	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * com.cougil.uoc.seghismed.business.PacientClientService#desxifrarVisitesProtegides(com.cougil
	 * .uoc.seghismed.model.Historial, com.cougil.uoc.seghismed.model.Pacient)
	 */
	public Set<Visita> desxifrarVisitesProtegides(Historial historial, Pacient pacient) {
		// desxifrem el conjunt de visites signades i xifrades per veure el seu contingut, signades
		// i xifrades pel gestor per al destinatari en qüestió
		Set<Visita> visitesProtegides = this.cipherService.verificarDesxifrarVisitesProtegides(historial
				.getVisitesProtegides(), pacient);
		SeghismedUtils.logVisites("Visites xifrades i signades", visitesProtegides);
		return visitesProtegides;
	}

	/*
	 * (non-Javadoc)
	 *
	 * @see com.cougil.uoc.seghismed.business.impl.CoreClientServiceImpl#getWebService()
	 */
	@Override
	protected PacientWebService getWebService() {
		return (PacientWebService) this.webService;
	}



}
